package com.yc.url;

import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class URLDemo {
    public static void main(String[] args) throws IOException {
    url();
   //downfile("http://www.hyycinfo.com/index.html?a=100&b=abc#xxyz","E:\\文件柜");

    }

       static void url() throws IOException {
            URL url = new URL("http://www.hyycinfo.com/index.html?a=100&b=abc#xxyz");
            System.out.println("url.getProtocol() = " + url.getProtocol());
            System.out.println("url.getHost() = " + url.getHost());
            System.out.println("url.getPort() = " + url.getPort());
            System.out.println("url.getPath() = " + url.getPath());
            System.out.println("url.getQuery() = " + url.getQuery());
       /* url.getProtocol() = http
        url.getHost() = www.hyycinfo.com
        url.getPort() = -1
        url.getPath() = /index.html
        url.getQuery() = a=100&b=abc*/

            URLConnection urlConnection = url.openConnection();
            System.out.println("urlConnection.getContentEncoding() = " + urlConnection.getContentEncoding());//null
            System.out.println("urlConnection.getContentLengthLong() = " + urlConnection.getContentLengthLong());//-1

            InputStream in = urlConnection.getInputStream();

  //乱码 字符集问题
            byte[] bytes=new byte[1024];
        int count;
        while((count=in.read(bytes))>0) {
            System.out.println(count);
            String s = new String(bytes, 0, count);
            System.out.println(s);
        }
          /*  1、字符流和字节流的区别
            1.1、stream结尾都是字节流，reader和writer结尾都是字符流，在读写文件需要对内容按行处理，比如比较特定字符，处理某一行数据的时候一般会选择字符流。只是读写文件，和文件内容无关的，一般选择字节流。
            1.2、读写单位不同：字节流以字节（8bit）为单位，字符流以字符为单位，根据码表映射字符，一次可能读多个字节。
            1.3、处理对象不同：字节流能处理所有类型的数据（如图片、avi等），而字符流只能处理字符类型的数据。
            1.4、字节流在操作的时候本身是不会用到缓冲区的，是文件本身的直接操作的；而字符流在操作的时候下后是会用到缓冲区的，是通过缓冲区来操作文件，我们将在下面验证这一点。
所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的，所以它对多国语言支持性比较好！
如果是音频文件、图片、歌曲，就用字节流好点，如果是关系到中文（文本）的，用字符流好点

*/

            //字节流 转 字符流
            InputStreamReader isr = new InputStreamReader(in, "utf-8");
            //可以按行读取的字符流
            BufferedReader br = new BufferedReader(isr);
            //java流设计模式 ： 装饰器模式

            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }


            in.close();

        }


//下載文档到指定的目录
    public static void downfile(String address, String dir) throws IOException {
        URL url = new URL(address);
        URLConnection urlConnection = url.openConnection();

        //提取文件名
        String path = url.getPath();
        String filename = path.replaceAll(".*/([^/]+)", "$1");
        //filename=index.html
        String filepath = dir + "/" + filename;

        try (InputStream in = urlConnection.getInputStream(); //返回从此打开的连接读取的输入流。比如获取io响应数据
             FileOutputStream fos = new FileOutputStream(filepath)) {
            byte[] bytes = new byte[1024];
            int count;
            while ((count = in.read(bytes)) > 0) {
                System.out.println(count);
                fos.write(bytes, 0, count);
            }

        }
        System.out.printf("下载 %S 到 %s\n", address, filename);
    }
}